package net.bat.db;

import java.io.Serializable;
import java.util.List;

import org.hibernate.metadata.ClassMetadata;
import org.springframework.orm.hibernate3.HibernateTemplate;

public interface BaseDAO {
	public void executeSQL(final String queryString);
	/**
	 * 获取数据类元数据
	 * @param cn
	 * @return
	 */
	public ClassMetadata getClassMeta(String cn);
	/**
	 * 根据类名和主键值加载对象 
	 * @param cn
	 * @param keyValue
	 * @return
	 */
	public Object loadPO(String cn,String keyValue)throws Exception;
	/**
	 * 根据类名获得默认对象 
	 * @param cn
	 * @return
	 */
	public Object getDefaultObj(String cn);
	/**
	 * 获取分页数据
	 * @param hql
	 * @param first
	 * @param rownum
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public List get(final String hql,  final int first, final int rownum);
	/**
	* 保存（持久化）一个对象
	*
	* @param object
	* 要保存的对象
	*/
	public void save(Object object);
	/**
	* 更新一个对象
	*
	* @param object
	* 要修改的对象
	*/
	public void update(Object object);
	/**
	* 用语句更新记录
	*
	* @param queryString
	* 查询语句
	* @param parameters
	* 参数
	*/
	public void updateByQuery(final String queryString,
	final Object[] parameters);
	/**
	* 删除一个对象
	*
	* @param object
	* 要删除的对象
	*/
	public void delete(Object object);
	/**
	* 根据类型和对象id删除一个对象
	*
	* @param clazz
	* 类型
	* @param id
	* 对象id
	*/
	public void delete(Class clazz, Serializable id);
	/**
	* 根据类型删除全部对象
	*
	* @param clazz
	* 类型
	* @return Integer
	*/
	
	public Integer deleteAll(final Class clazz);
	/**
	* 根据查询和参数删除全部对象
	*
	* @param queryString
	* 查询语句
	* @param parameters
	* 参数
	* @return Integer
	*/
	public Integer deleteByQuery(final String queryString,
	final Object[] parameters);
	/**
	* 获得某个类型的全部对象列表
	*
	* @param clazz
	* 类型
	* @return 对象集合
	*/
	public List findAll(Class clazz);
	/**
	* 根据类型和对象id载入一个对象
	*
	* @param clazz
	* 类型
	* @param id
	* 对象id
	* @return 目标对象
	*/
	public Object load(Class clazz, Serializable id);
	/**
	* 根据类型和对象id从数据库取得一个对象
	*
	* @param clazz
	* 类
	* @param id
	* 对象id
	* @return 目标对象
	*/
	public Object get(Class clazz, Serializable id);
	/**
	* 根据查询语句和查询参数从数据库取得一个对象
	*
	* @param queryString
	* 查询语句
	* @param parameters
	* 参数
	* @return Object 单个对象
	*/
	public Object get(final String queryString, final Object[] parameters);
	/**
	* 根据查询语句和查询参数从数据库取得一个对象
	*
	* @param queryString
	* 查询语句
	* @param parameter
	* 参数
	* @return Object 单个对象
	*/

	public Object get(final String queryString, final Object parameter);
	/**
	* 命名查询
	*
	* @param queryString
	* 查询语句
	* @return 对象列表
	*/

	public List findByNamedQuery(final String queryName);
	/**
	* 依据单个参数做命名查询
	*
	* @param query
	* 命名查询语句
	* @param parameter
	* 单个查询参数
	* @return 对象列表
	*/
	public List findByNamedQuery(final String queryString,
	final Object parameter);
	/**
	* 依据参数数组做命名查询
	*
	* @param query
	* 命名查询语句
	* @param parameters
	* 查询参数数组
	* @return 对象列表
	*/
	public List findByNamedQuery(final String queryString,
	final Object[] parameters);
	/**
	* 查询全部
	*
	* @param query
	* 查询语句
	* @return 对象列表
	*/
	public List find(final String queryString);
	/**
	* 带参数查询全部
	*
	* @param queryString
	* 查询语句
	* @param parameters
	* 查询参数
	* @return 对象列表
	*/
	public List find(final String queryString, final Object parameter);

	/**
	* 查询前n条记录
	*
	* @param query
	* 查询语句
	* @param n
	* 最多记录数
	* @return 对象列表
	*/
	public List find(final String queryString, final Object[] parameters);
	/**
	* 查询前n条记录
	*
	* @param query
	* 查询语句
	* @param n
	* 最多记录数
	* @return 对象列表
	*/
	public List findTop(final String queryString, int n);
	/**
	* 带参数查询前n条记录
	*
	* @param queryString
	* 查询语句
	* @param parameters
	* 查询参数
	* @param n
	* 最多记录数
	* @return 对象列表
	*/
	public List findTop(final String queryString, final Object[] parameters,
	int n);
	/**
	* 分页查询
	*
	* @param queryString
	* 查询语句
	* @param parameters
	* 参数
	* @param page
	* 分页信息
	* @return List 对象列表
	*/
	public List findPageByQuery(final String queryString,
	final Object[] parameters, final Page page);

	/**
	* 查询记录总数
	*
	* @param queryString
	* 查询语句
	* @param parameters
	* 参数
	* @return Integer 记录数
	*/
	public Integer getCountByQuery(final String queryString,
	final Object[] parameters);

	public void cleanSession();

	}